﻿#include "mythread.h"
#include <QElapsedTimer>  //计算执行时间的类
#include <QtGlobal>
#include <QMutex>
static QMutex g_mutex;  // 线程锁
Generate::Generate(QThread *parent)
    : QThread{parent}
{

}

void Generate::recvNum(int num)
{
    m_num = num;
}

void Generate::run()
{
    qDebug() <<"生成随机数的线程的地址："<<QThread::currentThread();  //输出当前线程的地址
    QVector<int> list;
    QElapsedTimer time;
    time.start();
    for (int i=0;i<m_num;i++){
        list.push_back(rand() % 100000);
    }
    int milsec = time.elapsed();

    qDebug() <<"生成"<<m_num<<"个随机数总共用时"<<milsec<<"毫秒";
    emit sendArray(list);
}
//------------------------------------------------------------冒泡排序
BubbleSort::BubbleSort(QThread *parent) :QThread(parent)
{

}

void BubbleSort::recvArray(QVector<int> list)
{
    m_list = list;
}

void BubbleSort::run()
{
    g_mutex.lock();
    qDebug() <<"冒泡排序的线程的地址："<<QThread::currentThread();  //输出当前线程的地址
    QElapsedTimer time;
    time.start();
    int temp;
    for (int i=0;i<m_list.size();++i){
        for(int j = 0;j<m_list.size()-i-1;++j){
            if(m_list[j]>m_list[j+1]){
                temp = m_list[j];
                m_list[j] = m_list[j+1];
                m_list[j+1] = temp;
            }
        }
    }
    int milsec = time.elapsed();

    qDebug() <<"冒泡排序总共用时"<<milsec<<"毫秒";
    emit Finish_Array(m_list);
    g_mutex.unlock();
}

//------------------------------------------------------------选择排序
SelectSort::SelectSort(QThread *parent) :QThread(parent)
{

}

void SelectSort::recvArray(QVector<int> list)
{
    m_list = list;
}

void SelectSort::run()
{

    qDebug() <<"选择排序的线程的地址："<<QThread::currentThread();  //输出当前线程的地址
    QElapsedTimer time;
    time.start();
    int temp;
    for (int i = 0; i < m_list.size() - 1; ++i) {
        // 假设当前元素为最小值
        int minIndex = i;
        // 从当前元素的下一个位置开始寻找更小的元素
        for (int j = i + 1; j < m_list.size(); ++j) {
            if (m_list[j] < m_list[minIndex]) {
                minIndex = j;
            }
        }
        // 如果找到更小的元素，则交换它们
        if (minIndex != i) {
            std::swap(m_list[i], m_list[minIndex]);
        }
    }
    int milsec = time.elapsed();
    qDebug() <<"选择排序总共用时"<<milsec<<"毫秒";
    emit Select_Array(m_list);
}
//------------------------------------------------------------快速排序
void QuickSort::quickSort(QVector<int> &s, int l, int r) {
    if (l >= r) return;  // 递归结束条件
    int pivot = s[l];  // 基准元素
    int i = l, j = r;
    while (i < j) {
        while (i < j && s[j] >= pivot) j--;
        if (i < j) s[i++] = s[j];
        while (i < j && s[i] <= pivot) i++;
        if (i < j) s[j--] = s[i];
    }
    s[i] = pivot;
    quickSort(s, l, i - 1);  // 对左边子序列进行快速排序
    quickSort(s, i + 1, r);  // 对右边子序列进行快速排序
}

QuickSort::QuickSort(QThread *parent):QThread(parent)
{

}

void QuickSort::recvArray(QVector<int> list)
{
    m_list = list;
}

void QuickSort::run()
{
    qDebug() <<"快速排序的线程的地址："<<QThread::currentThread();  //输出当前线程的地址
    QElapsedTimer time;
    time.start();

    quickSort(m_list,0,m_list.size()-1);

    int milsec = time.elapsed();

    qDebug() <<"快速排序总共用时"<<milsec<<"毫秒";
    emit Finish_Array(m_list);
}
